有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是“断言错误”好的做法?

我目前正在编写一个函数,根据给定的条件从列表中返回一个对象。看起来是这样的:

for (Object object : list) {
    if (condition(object)) {
        return object;
    }
}

这个函数应该总是从列表中返回一些东西,如果没有找到匹配的对象,这是一个错误的调用,一个严重的错误,程序应该停止

因此,在启用断言时,我在循环结束后做了以下工作:

assert false; // Will always trigger in debug mode.
return null; // No matter anyway, an AssertionException has already been thrown.

但我想知道我做得好不好
如果没有,我应该怎么做?我自己也有例外吗

无论如何,这种情况有什么规范吗


共 (2) 个答案

  1. # 1 楼答案

    断言或抛出异常的问题在于,您需要使用异常处理来处理并非真正例外的情况

    此外,您无法真正确定是什么引发了您捕获的异常/断言。它可能被抛出到您期望的位置,但它也可能被抛出到过滤代码中,例如,因此检查异常以检测“未找到”情况可能会将其他问题与该情况混为一谈

    另一种方法是使用^{}(对于Java 8之前的版本,Guava中也存在类似的类;或者您可以简单地使用Set<Object>,但这并不表示您希望找到0或1个值):

    Optional<Object> method(List<?> list) {
      for (Object object : list) {
          if (condition(object)) {
              return Optional.of(object);
          }
      }
      return Optional.empty();
    }
    

    现在,在调用代码中,您明确知道列表中可能找不到项:

    Optional<Object> opt = method(list);
    if (opt.isPresent()) {
      Object obj = opt.get();
      // Handle the fact it was found.
    } else {
      // Handle the fact it wasn't found.
    }
    

    而不是异常处理,您可能会忘记添加

  2. # 2 楼答案

    我宁愿在调用函数时检查其返回值

    if (yourFunctionWithList(parameter) == null)
       //error handling, maybe throw new NPException or whatever. 
    else
       //some object was returned
    

    您也可以编写自己的异常类,并以任何方式处理它

    我个人认为assert false不是好的做法

    编辑

    如果是关于将被抛出的AssertionException,那么您也可以像这样使用它

    throw new AssertionError ("your error msg here");
    

    所以你可以用同样的方式处理